package com.lyf.scm.plan.insfrastructure.db.mapper;


import com.lyf.scm.plan.api.dto.SalesPlanOtherDTO;
import com.lyf.scm.plan.insfrastructure.db.dataobject.*;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * description:
 * 其他渠道计划（scm_sales_plan_other）数据库访问层
 *
 * @author: huangtao
 * @data: 2020/7/31
 */
public interface SalesPlanOtherMapper {


    /**
     * 先查询需要展示的条数
     *
     * @param salesPlanSelect
     * @return
     */
    List<Map<String,String>> listWeekBySelective(SalesPlanSelectDO salesPlanSelect);


    /**
     * 先查询需要展示的条数（准确率）
     *
     * @param salesPlanSelect
     * @return
     */
    List<SalesPlanOtherAccuracyDO> listWeekBySelectiveAccuracy(SalesPlanSelectDO salesPlanSelect);

    /**
     * 查询出对应的指标数量(准确率)
     *
     * @param salesPlanOtherAccuracyDO
     * @return
     */
    List<SalesPlanOtherAccuracyDO> listSalesAndTargetAccuracy(SalesPlanOtherAccuracyDO salesPlanOtherAccuracyDO);

    /**
     * 查询出对应的指标数量(准确率)
     *
     * @param salesPlanOtherDO
     * @return
     */
    List<SalesPlanOtherDO> listSalesAndTarget(SalesPlanOtherDO salesPlanOtherDO);

    /**
     * 查询对应柱形图的指标
     *
     * @param salesPlanSelect
     * @return
     */
    List<SalesPlanOtherDO> listAllByCycles(SalesPlanSelectDO salesPlanSelect);


    /**
     * 查询对应柱形图的指标(准确率)
     *
     * @param salesPlanSelect
     * @return
     */
    List<SalesPlanOtherAccuracyDO> listAllByCyclesAccuracy(SalesPlanSelectDO salesPlanSelect);

    /**
     * 根据搜索条件查询出所有的数据
     *
     * @param dtoToDO dto做
     * @return {@link List<SalesPlanOtherDO>}
     */
    List<SalesPlanOtherDO> listAllByCondition(SalesPlanSelectDO salesPlanSelect);

    /**
     * 根据搜索条件查询出所有的数据(准确率)
     *
     * @param dtoToDO dto做
     * @return {@link List<SalesPlanOtherAccuracyDO>}
     */
    List<SalesPlanOtherAccuracyDO> listAllByConditionAccuracy(SalesPlanSelectDO salesPlanSelect);

    /**
     * 批量导入其他渠道计划
     *
     * @param dtos
     * @return
     *//*
    Integer importPlanType(List<SalesPlanOtherDO> dtos);*/

    /**
     * 根据id集合查询比例
     *
     * @param ids id
     * @return {@link List<String>}
     */
    List<SalesPlanOtherDO> getListById(@Param("list") List<Long> ids);

    /**
     * 查询其他渠道的数据
     *
     * @param demandPlanToOtherDo 其他做需求计划
     * @return {@link List<SalesPlanOtherDO>}
     */
    List<SalesPlanOtherDO> listPlanOther(SalesPlanOtherDO demandPlanToOtherDo);

    /**
     * 批量导入
     *
     * @param list
     * @return
     */
    Integer addPlanOtherData(List<SalesPlanOtherDO> list);

    /**
     * 批量修改其他渠道计划状态
     *
     * @param list
     * @return
     */
    Integer updatePlanOtherType(List<SalesPlanOtherDO> list);


    /**
     * 更新确认量
     *
     * @param list
     * @return
     */
    Integer updateConfirm(List<SalesPlanOtherDO> list);

    /**
     * 根据活动编码集合获取其他渠道计划
     *
     * @param numbers
     * @return
     */
    List<SalesPlanOtherDO> getListByNumbers(@Param("list") List<String> numbers);


    /**
     * 查询数据库是否存在导入数据（到省）
     *
     * @param dtos
     * @return
     */
    List<SalesPlanOtherDO> getRepeatPro(SalesPlanOtherDO dtos);

    /**
     * 查询数据库是否存在导入数据（到市）
     *
     * @param dtos
     * @return
     */
    List<SalesPlanOtherDO> getRepeatCity(SalesPlanOtherDO dtos);

    /**
     * 查询数据库是否存在导入数据（到门店）
     *
     * @param dtos
     * @return
     */
    List<SalesPlanOtherDO> getRepeatStore(SalesPlanOtherDO dtos);


    /**
     * 批量修改重复计划量
     *
     * @param list
     * @return
     */
    Integer updateAll(List<SalesPlanOtherDO> list);

    /**
     * 修改销售计划状态改为已确认（全部）每周日晚11点前同步(时间不定)
     *
     * @return
     */
    Integer updateConfirmStatus();


    /**
     * 修改营销计划状态改为不能取消
     *
     * @return
     */
    Integer updateCancelStatus();

    /**
     * 查询其他渠道销售计划差异指标
     *
     * @param salesPlanOtherDO 其他销售计划做
     * @return {@link List<SalesPlanOtherDO>}
     */
    List<SalesPlanOtherDO> listSalesAndTargetDifferent(SalesPlanOtherDO salesPlanOtherDO);

    /**
     * 查询其他渠道销售计划差异柱状图
     *
     * @param salesPlanOtherDTO 销售计划其他dto
     * @return {@link List<SalesPlanOtherDO>}
     */
    List<SalesPlanOtherDO> listAllByDifferentCycles(SalesPlanOtherDTO salesPlanOtherDTO);

    /**
     * 列出所有的条件不同
     *
     * @param SalesPlanSelectDO 销售计划其他dto
     * @return {@link List<SalesPlanOtherDO>}
     */
    List<SalesPlanOtherDO> listAllByConditionDifferent(SalesPlanSelectDO SalesPlanSelectDO);

    /**
     * 查询当天导入新品新店数据
     *
     * @return
     */
    List<SalesPlanOtherDO> listBySalesOtherPlan();

    /**
     * 推送交易中心返回状态
     *
     * @param store       门店CODE
     * @param type        类型 1：成功，2：失败
     * @param PresaleType 预售类型 1：新店，2：新品
     * @param msg         返回错误原因
     */
    void updatePushStatus(@Param("store") String store, @Param("arrivalDate") Date arrivalDate, @Param("statusType") Integer statusType, @Param("presaleType") Integer presaleType, @Param("msg") String msg);

    /**
     * 删除对应标识的数据
     *
     * @param opSign
     */
    void delete(@Param("opSign") String opSign);

    /**
     * 根据标识删除数据
     * 
     * @param opSign
     */
    void deleteByOpSign(@Param("opSign") String opSign);

    /**
     * 根据计划开始时间和结束时间查询数据
     * 
     * @param startTime
     * @param endTime
     * @param type
     * @return
     */
    List<SalesPlanOtherDO> getLastWeekByType(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("list") List<String> types);

    /**
     * 修改上次计划量和上次确认量
     *
     * @param list
     */
    void updateLastDate(List<SalesPlanOtherDO> list);

    /**
     * 查询上次计量、确认量
     *
     * @param salesPlanOtherDO
     * @return
     */
    List<SalesPlanOtherDO> getLastPlanData(SalesPlanOtherDO salesPlanOtherDO);
}
